package com.jboltai.util.other;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.UUID;
import com.benjaminwan.ocrlibrary.OcrResult;
import io.github.mymonstercat.Model;
import io.github.mymonstercat.ocr.InferenceEngine;
import io.github.mymonstercat.ocr.config.ParamConfig;

import java.io.File;
import java.io.InputStream;

/**
 * OCR工具类
 */
public class JBoltOCR {


    /**
     * 识别图片
     * @param imageFile
     * @return
     */
    public static String read(File imageFile) {
        InferenceEngine engine = InferenceEngine.getInstance(Model.ONNX_PPOCR_V4);
        OcrResult ocrResult = engine.runOcr(imageFile.getPath());
        return ocrResult.getStrRes();
    }

    /**
     * 识别图片
     * @param is
     * @return
     */
    public static String read(InputStream is) {
        String tempDir = System.getProperty("java.io.tmpdir");
        File file = new File(tempDir + UUID.fastUUID().toString());
        try {
            FileUtil.writeFromStream(is, file );
            return read(file);
        } finally {
            if (file.exists()) {
                FileUtil.del(file);
            }
        }
    }


    /**
     * 识别图片
     * @param imageFile
     * @param config <table><thead><tr><th>配置项</th><th>说明</th></tr></thead><tbody><tr><td>padding</td><td>图像外接白框，用于提升识别率，文字框没有正确框住所有文字时，增加此值。默认50。</td></tr><tr><td>maxSideLen</td><td>按图像长边进行总体缩放，放大增加识别耗时但精度更高，缩小减小耗时但精度降低，maxSideLen为0表示不缩放</td></tr><tr><td>boxScoreThresh</td><td>文字框置信度门限，文字框没有正确框住所有文字时，减小此值，默认0.5f	fl</td></tr><tr><td>boxThresh</td><td>值越大，文字部分会越小，默认0.3f</td></tr><tr><td>unClipRatio</td><td>单个文字框大小倍率，越大时单个文字框越大，默认1.6f</td></tr><tr><td>doAngleFlag</td><td>启用/禁用 文字方向检测，只有图片倒置的情况下(旋转90~270度的图片)，才需要启用文字方向检测，默认关闭</td></tr><tr><td>mostAngleFlag</td><td>启用/禁用 角度投票(整张图片以最大可能文字方向来识别)，当禁用文字方向检测时，此项也不起作用，默认关闭</td></tr></tbody></table>
     * @return
     */
    public static String read(File imageFile, ParamConfig config) {
        InferenceEngine engine = InferenceEngine.getInstance(Model.ONNX_PPOCR_V4);
        OcrResult ocrResult = engine.runOcr(imageFile.getPath(), config);
        return ocrResult.getStrRes();
    }


    /**
     * 识别图片
     * @param is
     * @param config <table><thead><tr><th>配置项</th><th>说明</th></tr></thead><tbody><tr><td>padding</td><td>图像外接白框，用于提升识别率，文字框没有正确框住所有文字时，增加此值。默认50。</td></tr><tr><td>maxSideLen</td><td>按图像长边进行总体缩放，放大增加识别耗时但精度更高，缩小减小耗时但精度降低，maxSideLen为0表示不缩放</td></tr><tr><td>boxScoreThresh</td><td>文字框置信度门限，文字框没有正确框住所有文字时，减小此值，默认0.5f	fl</td></tr><tr><td>boxThresh</td><td>值越大，文字部分会越小，默认0.3f</td></tr><tr><td>unClipRatio</td><td>单个文字框大小倍率，越大时单个文字框越大，默认1.6f</td></tr><tr><td>doAngleFlag</td><td>启用/禁用 文字方向检测，只有图片倒置的情况下(旋转90~270度的图片)，才需要启用文字方向检测，默认关闭</td></tr><tr><td>mostAngleFlag</td><td>启用/禁用 角度投票(整张图片以最大可能文字方向来识别)，当禁用文字方向检测时，此项也不起作用，默认关闭</td></tr></tbody></table>
     * @return
     */
    public static String read(InputStream is, ParamConfig config ) {
        String tempDir = System.getProperty("java.io.tmpdir");
        File file = new File(tempDir + UUID.fastUUID().toString());
        try {
            FileUtil.writeFromStream(is, file );
            return read(file, config);
        } finally {
            if (file.exists()) {
                FileUtil.del(file);
            }
        }
    }




}
